
package carmadness.model.helpers;

/**
 * A szkeleton naplózását megvalósító osztály.
 * 
 * @author sztomi
 */
public class Logger
{
	/**
	 * A behúzás mértékét számontartó attribútum.
	 */
	private static int _indent = 0;
	private static boolean on = true;

	/**
	 * Visszatér egy n*3 hosszúságú, space-ekből álló stringgel (a behúzáshoz).
	 * 
	 * @param n
	 *            A behúzások száma.
	 * @return Egy n*3 hosszúságú, space-ekből álló string.
	 */
	private static String nSpace( int n )
	{
		StringBuilder sb = new StringBuilder( n * 3 );

		for ( int i = 0; i < n; ++i )
		{
			sb.append( "   " ); // három hosszúságú string
		}

		return sb.toString();
	}

	/**
	 * Kikapcsolja a naplózást.
	 */
	public static void turnOff()
	{
		on = false;
	}

	/**
	 * Bekapcsolja a naplózást.
	 */
	public static void turnOn()
	{
		on = true;
	}

	/**
	 * Hívás naplózását végzi, növeli a behúzás mértékét.
	 * 
	 * @param msg
	 *            A kiírandó üzenet (tipikusan függvénynév
	 */
	public static void call( String msg )
	{
		if ( on )
		{
			System.out.println( String.format( "%s-> [%s]", nSpace( _indent ), msg ) );
			++_indent;
		}
	}

	/**
	 * Hívás naplózását végzi, növeli a behúzás mértékét.
	 * 
	 * @param msg
	 *            A kiírandó üzenet (tipikusan függvénynév.
	 * @param Az
	 *            objektum, amelyen a hívás történik.
	 */
	public static void call( String msg, Object obj )
	{
		if ( on )
		{
			System.out.println( String.format( "%s-> [%s]", nSpace( _indent ), msg, obj.hashCode() ) );
			++_indent;
		}
	}

	/**
	 * Hívás naplózását végzi, nem növeli a behúzás mértékét, de az aktuálisnál
	 * egyel nagyobb behúzást használ.
	 * 
	 * @param msg
	 *            A kiírandó üzenet (tipikusan függvénynév).
	 * @param self
	 *            A hívó objektum.
	 */
	public static void print( String msg, Object self )
	{
		if ( on )
		{
			System.out.println( String.format( "%s[%s | %d]", nSpace( _indent ), msg, self.hashCode() ) );
		}
	}

	/**
	 * Hívás naplózását végzi, nem növeli a behúzás mértékét, de az aktuálisnál
	 * egyel nagyobb behúzást használ.
	 * 
	 * @param msg
	 *            A kiírandó üzenet (tipikusan függvénynév)
	 * @param self
	 *            A hívó objektum.
	 */
	public static void print( String msg )
	{
		if ( on )
		{
			System.out.println( String.format( "%s[%s]", nSpace( _indent ), msg ) );
		}
	}

	/**
	 * Visszatérést naplóz és csökkenti a behúzást.
	 */
	public static void ret()
	{
		if ( on )
		{
			--_indent;
			System.out.println( String.format( "%s<-", nSpace( _indent ) ) );
		}
	}
}
